package com.sjzd.weixin.service;

import com.sjzd.meeting.pojo.User;
import com.sjzd.meeting.pojo.WxUser;
import com.sjzd.meeting.service.IUserService;
import com.sjzd.meeting.service.IWxUserService;
import com.sjzd.weixin.bean.message.MessageType;
import com.sjzd.weixin.bean.message.plain.resp.Article;
import com.sjzd.weixin.bean.message.plain.resp.NewsMessage;
import com.sjzd.weixin.bean.message.plain.resp.TextMessage;
import com.sjzd.weixin.utils.MessageUtils;
import com.sjzd.weixin.utils.WxUtils;
import org.dom4j.DocumentException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Service
public class MessageService {

    @Autowired
    private IWxUserService wxUserService;

    @Autowired
    private IUserService userService;

    @Value("${wx.domainName}")
    private String domainName;

    private static final Logger log = LoggerFactory.getLogger(MessageService.class);
    /**
     *  处理发来的请求
     */
    public String processRequest(HttpServletRequest req) {
        // 默认回复消息内容
        String defaultResponseMsg = "请求处理异常，请稍后重试！";
        InputStream in = null;
        try {
            in = req.getInputStream();
            // 解析请求信息
            HashMap<String, String> requestMsgMap = MessageUtils.parseXML(in);
            // 发送方帐号（open_id） 下面三行代码是： 从HashMap中取出消息中的字段；
            String fromUserName = requestMsgMap.get("FromUserName");
            // 公众帐号
            String toUserName = requestMsgMap.get("ToUserName");
            // 消息类型
            String msgType = requestMsgMap.get("MsgType");

            // 统一回复文本信息
            TextMessage textMessage = new TextMessage();
            textMessage.setToUserName(fromUserName);
            textMessage.setFromUserName(toUserName);
            textMessage.setCreateTime("" + new Date().getTime());
            textMessage.setMsgType("text");
            String respContent = "";
            // 文本消息
            if (msgType.equalsIgnoreCase(MessageType.REQ_MESSAGE_TYPE_TEXT)) {
                respContent = "您发送的是文本消息！";
            }
            // 图片消息
            else if (msgType.equalsIgnoreCase(MessageType.REQ_MESSAGE_TYPE_IMAGE)) {
                respContent = "您发送的是图片消息！";
            }
            // 地理位置消息
            else if (msgType.equalsIgnoreCase(MessageType.REQ_MESSAGE_TYPE_LOCATION)) {
                respContent = "您发送的是地理位置消息！";
            }
            // 链接消息
            else if (msgType.equalsIgnoreCase(MessageType.REQ_MESSAGE_TYPE_LINK)) {
                respContent = "您发送的是链接消息！";
            }
            // 音频消息
            else if (msgType.equalsIgnoreCase(MessageType.REQ_MESSAGE_TYPE_VOICE)) {
                respContent = "您发送的是音频消息！";
            }
            // 事件推送
            else if (msgType.equalsIgnoreCase(MessageType.REQ_MESSAGE_TYPE_EVENT)) {
                // 事件类型
                String eventType = requestMsgMap.get("Event");
                // 事件KEY值，与创建自定义菜单时指定的KEY值对应
                String eventKey = requestMsgMap.get("EventKey");
                // 订阅
                if (eventType.equalsIgnoreCase(MessageType.EVENT_TYPE_SUBSCRIBE)) {
                    respContent = "欢迎关注讲座达人微信公众号,在这里你可以参与发单和抢单操作。";
                    WxUser wxUser = WxUtils.extractUserInfoJsonToWxUser(fromUserName);
                    wxUserService.save(wxUser);
                }
                // 取消订阅
                else if (eventType.equalsIgnoreCase(MessageType.EVENT_TYPE_UNSUBSCRIBE)) {
                    // TODO 取消订阅后用户再收不到公众号发送的消息，因此不需要回复消息
                }
                // 自定义菜单点击事件
                else if (eventType.equalsIgnoreCase(MessageType.EVENT_TYPE_CLICK)) {
                    if (eventKey.equals("12")) { // 讲座抢单
                        /**
                         *  查看用户是否绑定
                         *      是：
                         *          查看他是否具有抢单权限
                         *              是：跳转到抢单页面
                         *              否： 发送普通消息通知用户无法抢单
                         *      否： 发送图文消息告诉用户去绑定
                         */
                        WxUser wxUser = wxUserService.selectByOpenId(fromUserName);
                        User user = userService.selectByWxid(wxUser.getId());
                        List<Article> articles = new ArrayList<>(10);
                        Article article = new Article();
                        if (null == user) {  // 没有绑定用户
                            article.setTitle("你还没有绑定用户，无法参与抢单");
                            article.setDescription("抢单操作需要绑定用户后才能操作，请到点击进行绑定");
                            article.setPicUrl("https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=121278746,1374994184&fm=26&gp=0.jpg");
                            article.setUrl(domainName + "/weixin/selfCenter");
                        } else {
                            if (user.getRid() != 2) { // 不具有抢单权限
                                article.setTitle("尊敬的"+user.getName()+"用户您好,你是发单组成员，无法进行抢单操作");
                                article.setDescription("提示：根据本平台规定，发单组成员无法进行抢单操作");
                                article.setPicUrl("https://dss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=121278746,1374994184&fm=26&gp=0.jpg");
                                article.setUrl(domainName + "/error");
                            } else {
                                article.setTitle("尊敬的"+user.getName()+"用户您好,你是抢单组成员，祝你抢单愉快");
                                article.setDescription("提示： 点击进行抢单操作");
                                article.setPicUrl("http://img5.imgtn.bdimg.com/it/u=3482660162,2168572903&fm=26&gp=0.jpg");
                                article.setUrl(domainName + "/meetingGrab/grab?uid=" + user.getId());
                            }
                        }
                        articles.add(article);
                        NewsMessage newsMessage = new NewsMessage();
                        newsMessage.setArticleCount("1");
                        newsMessage.setArticles(articles);
                        newsMessage.setFromUserName(toUserName);
                        newsMessage.setToUserName(fromUserName);
                        newsMessage.setMsgType(MessageType.RESP_MESSAGE_TYPE_NEWS);
                        newsMessage.setCreateTime(new Date().toString());
                        return MessageUtils.createXML(newsMessage);
                    } else {
                        respContent = "您点击了菜单按钮";
                    }
                }
            }
            // 设置返回消息内容
            textMessage.setContent(respContent);
            String result = MessageUtils.createXML(textMessage);
            return result;
        } catch (IOException | DocumentException e) {
           log.error("处理客户发来的消息失败！ e : {}", e);
        } finally {
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                    log.error("资源释放失败！ e : {}", e);
                }
            }
        }
        return defaultResponseMsg;
    }

}
